home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / STATS.C < prev    next >
C/C++ Source or Header  |  1997-09-06  |  12KB  |  566 lines

  1. #include "global.h"
  2. #ifdef STATS
  3. #include "stats.h"
  4.  
  5.  
  6. #if !defined(_lint)
  7. static char rcsid[] OPTIONAL = "$Id: stats.c,v 1.16 1997/09/07 00:31:16 root Exp root $";
  8. #endif
  9.  
  10. static void updatestats (void);
  11. static void newhour (int hour);
  12. static void newday (int hour);
  13. static void endmonthclear (int hour, int month);
  14. static void endday (int hour);
  15. static void eachcycle (time_t now);
  16. static int doSTATclear (int argc,char *argv[],void *p);
  17. static int doSTATload (int argc,char *argv[],void *p);
  18. static void loadstats (const char *name,void *beginning, void *ending);
  19.  
  20.  
  21. static time_t statslast = 0;
  22.  
  23.  
  24. const char dailyhdr[] = "\n%s per hour in the last 24 hours (excluding current hour)\n\n";
  25. const char weeklyhdr[] = "\n%s per day in the last 7 days (excluding current day)\n\n";
  26. const char monthlyhdr[] = "\n%s per day in the last month (excluding current day)\n\n";
  27. const char yearlyhdr[] = "\n%s per month in the last year (excluding current month)\n\n";
  28.  
  29. const char STAT_emptystr[] = "";
  30. const char STAT_dailytrailer[] = 
  31.     "------------------------           ------------------------\n"
  32.     "0 0 0 0 0 1 1 1 1 1 2 2  Hour      0 0 0 0 0 1 1 1 1 1 2 2  Hour\n"
  33.     "0 2 4 6 8 0 2 4 6 8 0 2            0 2 4 6 8 0 2 4 6 8 0 2\n\n";
  34. const char STAT_weeklytrailer[] = 
  35.     "---------------------------------       ---------------------------------\n"
  36.     "SUN  MON  TUE  WED  THU  FRI  SAT       SUN  MON  TUE  WED  THU  FRI  SAT\n\n";
  37. const char STAT_monthlytrailer[] = 
  38.     "-------------------------------           -------------------------------\n"
  39.     " 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3  Days       0 0 0 0 1 1 1 1 1 2 2 2 2 2 3  Days\n"
  40.     " 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0             2 4 6 8 0 2 4 6 8 0 2 4 6 8 0\n\n";
  41. const char STAT_yearlytrailer[] = 
  42.     "------------           ------------\n"
  43.     " 0 0 0 0 1 1  Month     0 0 0 0 1 1  Month\n"
  44.     " 2 4 6 8 0 2            2 4 6 8 0 2\n\n";
  45. const char STAT_cannotclear[] = "Sorry, stats can only be cleared from the console\n";
  46.  
  47.  
  48.  
  49. static struct cmds STATScmds[] = {
  50. #ifdef STATS_AREA
  51.     { "area",    doSTATarea,    0,    0,    NULLCHAR },
  52. #endif
  53.     { "clear",    doSTATclear,    0,    0,    NULLCHAR },
  54. #ifdef STATS_FWD
  55.     { "forwarding",    doSTATforward,    0,    0,    NULLCHAR },
  56. #endif
  57. #ifdef STATS_HTTP
  58.     { "http",    doSTAThttp,    0,    0,    NULLCHAR },
  59. #endif
  60.     { "load",    doSTATload,    0,     0,    NULLCHAR },
  61. #ifdef STATS_MSG
  62.     { "messages",    doSTATmessage,    0,    0,    NULLCHAR },
  63. #endif
  64.     { "save",    doSTATsave,    0,     0,    NULLCHAR },
  65. #ifdef STATS_TFC
  66.     { "traffic",    doSTATtraffic,    0,    0,    NULLCHAR },
  67. #endif
  68. #ifdef STATS_USE
  69.     { "usage",    doSTATusage,    0,    0,    NULLCHAR },
  70. #endif
  71.     { NULLCHAR,    NULL,        0,    0,    NULLCHAR }
  72. };
  73.  
  74.  
  75. int
  76. dostats (int argc, char *argv[], void *p)
  77. {
  78.     return subcmd(STATScmds,argc,argv,p);
  79. }
  80.  
  81.  
  82. static int
  83. doSTATclear (int argc, char *argv[], void *p)
  84. {
  85. int c;
  86. struct mbuf *bp;
  87. int done = 0;
  88.  
  89.     if(Curproc->input != Command->input)
  90.         tputs (STAT_cannotclear);
  91.     else    {
  92.         if (argc == 2)
  93.             c = argv[1][0];
  94.         else    {
  95.             tputs ("\007Clear all statistics: Are you sure? ");
  96.             tflush ();
  97.             (void) recv_mbuf(Command->input,&bp,0,NULLCHAR,0);
  98.             c = bp->data[0];
  99.         }
  100.  
  101.         if(c == 'y' || c == 'Y')    {
  102.             done = 1;
  103. #ifdef STATS_AREA
  104.             (void) doSTATclear_area(argc, argv, p);
  105. #endif
  106. #ifdef STATS_USE
  107.             (void) doSTATclear_use(argc, argv, p);
  108. #endif
  109. #ifdef STATS_FWD
  110.             (void) doSTATclear_fwd(argc, argv, p);
  111. #endif
  112. #ifdef STATS_MSG
  113.             (void) doSTATclear_msg(argc, argv, p);
  114. #endif
  115. #ifdef STATS_TFC
  116.             (void) doSTATclear_tfc(argc, argv, p);
  117. #endif
  118. #ifdef STATS_HTTP
  119.             (void) doSTATclear_http(argc, argv, p);
  120. #endif
  121.         }
  122.     }
  123.     tprintf ("Statistics %scleared....\n", (done) ? "" : "not ");
  124.     return 0;
  125. }
  126.  
  127.  
  128. int
  129. doSTATsave (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  130. {
  131. FILE *fp;
  132. char buffer[256];
  133.  
  134.     sprintf (buffer, "%s/last", STATSDir);
  135.     fp = fopen (buffer, "w");
  136.     if (fp != NULLFILE)    {
  137.         fprintf (fp, "Last: %ld\n", statslast);
  138.         (void) fclose (fp);
  139.     } else
  140.         log (-1, "Can't open stats file '%s/last'", STATSDir);
  141.  
  142. #ifdef STATS_AREA
  143.     savestats_area();
  144. #endif
  145. #ifdef STATS_USE
  146.     savestats_use();
  147. #endif
  148. #ifdef STATS_FWD
  149.     savestats_fwd();
  150. #endif
  151. #ifdef STATS_MSG
  152.     savestats_msg();
  153. #endif
  154. #ifdef STATS_TFC
  155.     savestats_tfc();
  156. #endif
  157. #ifdef STATS_HTTP
  158.     savestats_http();
  159. #endif
  160.     return 0;
  161. }
  162.  
  163.  
  164.  
  165. static int
  166. doSTATload (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
  167. {
  168.     loadstats ("last", &statslast, &statslast);
  169.     kwait (NULL);
  170. #ifdef STATS_USE
  171.     loadstats_use();
  172. #endif
  173. #ifdef STATS_MSG
  174.     loadstats_msg();
  175. #endif
  176. #ifdef STATS_TFC
  177.     loadstats_tfc();
  178. #endif
  179. #ifdef STATS_AREA
  180.     loadstats_area();
  181. #endif
  182. #ifdef STATS_FWD
  183.     loadstats_fwd();
  184. #endif
  185. #ifdef STATS_HTTP
  186.     loadstats_http();
  187. #endif
  188.     return 0;
  189. }
  190.  
  191.  
  192.  
  193. static void
  194. loadstats (const char *name, void *beginning, void *ending)
  195. {
  196. char buffer[256], *cp;
  197. long *lp;
  198. FILE *fp;
  199.  
  200.     lp = (long *)beginning;
  201.     sprintf (buffer, "%s/%s", STATSDir, name);
  202.     fp = fopen (buffer, "r");
  203.     if (fp != NULLFILE)    {
  204.         while (!feof(fp))    {
  205.             kwait (NULL);
  206.             (void) fgets (buffer, 79, fp);
  207.             if (feof(fp))
  208.                 continue;
  209.             rip (buffer);
  210.             cp = strchr (buffer, ' ');
  211.             if (!cp)    {
  212.                 log (-1, "Error in loading stats file '%s/%s'", STATSDir, name);
  213.                 (void) fclose (fp);
  214.                 return;
  215.             }
  216.             *lp++ = atol (++cp);
  217.             if (lp > (long *)ending)
  218.                 break;
  219.             cp = strchr (cp, ' ');
  220.             if (cp)    {
  221.                 *lp++ = atol (++cp);
  222.                 if (lp > (long *)ending)
  223.                     break;
  224.             }
  225.         }
  226.         (void) fclose (fp);
  227.     } else
  228.         log (-1, "Can't open stats file '%s/%s'", STATSDir, name);
  229.     kwait (NULL);
  230. }
  231.  
  232.  
  233.  
  234. #if defined(STATS_USE) || defined(STATS_MSG) || defined(STATS_AREA) || defined(STATS_FWD) || defined(STATS_TFC) || defined(STATS_HTTP)
  235. void
  236. doGraph (int num, long array[][2])
  237. {
  238. long chart[31][2], highest[2], divisor[2];
  239. int k, l, m;
  240. int multiplyit[2];
  241.  
  242.     highest[0] = highest[1] = 0L;
  243.     divisor[0] = divisor[1] = 1L;
  244.     multiplyit[0] = multiplyit[1] = 0;
  245.     for (k = 0; k < num; k++)
  246.         chart[k][0] = chart[k][1] = 0L;
  247.     for (k = 0; k < num; k++)
  248.         for (l = 0; l < 2; l++)
  249.             if (array[k][l] > highest[l])
  250.                 highest[l] = array[k][l];
  251.  
  252.     for (k = 0; k < 2; k++)    {
  253.         if ((highest[k] < 10L) && highest[k])    {
  254.             multiplyit[k] = 1;
  255.             divisor[k] = (10 / highest[k]);
  256. #if 0
  257.             if (divisor[k] < 2)
  258.                 divisor[k] = 2;
  259. #endif
  260.         } else     if (highest[k] >= 10L)
  261.             divisor[k] = highest[k] / 10L;
  262.     }
  263.  
  264.     for (k = 0; k < num; k++)
  265.         for (l = 0; l < 2; l++)        {
  266.             if (multiplyit[l])
  267.                 chart[k][l] = array[k][l] * divisor[l];
  268.             else    {
  269.                 chart[k][l] = array[k][l] / divisor[l];
  270.                 if (array[k][l] % divisor[l])
  271.                     chart[k][l]++;
  272.             }
  273.             if (chart[k][l] > 10L)
  274.                 chart[k][l] = 10L;
  275.         }
  276.     for (m = 10; m ; m--)    {    /* each line */
  277.         for (l = 0; l < 2; l ++)    {
  278.             for (k = 0; k < num; k++)    {
  279.                 if (chart[k][l] >= m)    {    /*lint !e771 */
  280.                     if (num != 7)
  281.                         tputc ('*');
  282.                     else
  283.                         tputs ("***");
  284.                 } else {
  285.                     if (num != 7)
  286.                         tputc (' ');
  287.                     else
  288.                         tputs ("   ");
  289.                 }
  290.                 if (num == 7)
  291.                     tputs ("  ");
  292.             }
  293.             if (!l)    {
  294.                 if (num != 7)
  295.                     tputs ("           ");
  296.                 else
  297.                     tputs ("     ");
  298.             } else
  299.                 tputc('\n');
  300.         }
  301.     }
  302. }
  303. #endif
  304.  
  305.  
  306. static void
  307. updatestats(void)
  308. {
  309. #ifdef STATS_AREA
  310.     updatestats_area ();
  311. #endif
  312. #ifdef STATS_USE
  313.     updatestats_use ();
  314. #endif
  315. #ifdef STATS_FWD
  316.     updatestats_fwd ();
  317. #endif
  318. #ifdef STATS_MSG
  319.     updatestats_msg ();
  320. #endif
  321. #ifdef STATS_TFC
  322.     updatestats_tfc ();
  323. #endif
  324. }
  325.  
  326.  
  327. static void
  328. newhour (int hour)
  329. {
  330. #ifdef STATS_AREA
  331.     newhour_area(hour);
  332. #endif
  333. #ifdef STATS_USE
  334.     newhour_use(hour);
  335. #endif
  336. #ifdef STATS_FWD
  337.     newhour_fwd(hour);
  338. #endif
  339. #ifdef STATS_MSG
  340.     newhour_msg(hour);
  341. #endif
  342. #ifdef STATS_TFC
  343.     newhour_tfc(hour);
  344. #endif
  345. #ifdef STATS_HTTP
  346.     newhour_http(hour);
  347. #endif
  348. }
  349.  
  350.  
  351. static void
  352. newday (int day)
  353. {
  354. #ifdef STATS_AREA
  355.     newday_area (day);
  356. #endif
  357. #ifdef STATS_USE
  358.     newday_use (day);
  359. #endif
  360. #ifdef STATS_FWD
  361.     newday_fwd (day);
  362. #endif
  363. #ifdef STATS_MSG
  364.     newday_msg (day);
  365. #endif
  366. #ifdef STATS_TFC
  367.     newday_tfc (day);
  368. #endif
  369. #ifdef STATS_HTTP
  370.     newday_http (day);
  371. #endif
  372. }
  373.  
  374.  
  375. static void
  376. endmonthclear (int day, int month)
  377. {
  378. #ifdef STATS_AREA
  379.     endmonthclear_area (day, month);
  380. #endif
  381. #ifdef STATS_USE
  382.     endmonthclear_use (day, month);
  383. #endif
  384. #ifdef STATS_FWD
  385.     endmonthclear_fwd (day, month);
  386. #endif
  387. #ifdef STATS_MSG
  388.     endmonthclear_msg (day, month);
  389. #endif
  390. #ifdef STATS_TFC
  391.     endmonthclear_tfc (day, month);
  392. #endif
  393. #ifdef STATS_HTTP
  394.     endmonthclear_http (day, month);
  395. #endif
  396. }
  397.  
  398.  
  399. static void
  400. endday (int day)
  401. {
  402. #ifdef STATS_AREA
  403.     endday_area (day);
  404. #endif
  405. #ifdef STATS_USE
  406.     endday_use (day);
  407. #endif
  408. #ifdef STATS_FWD
  409.     endday_fwd (day);
  410. #endif
  411. #ifdef STATS_MSG
  412.     endday_msg (day);
  413. #endif
  414. #ifdef STATS_TFC
  415.     endday_tfc (day);
  416. #endif
  417. #ifdef STATS_HTTP
  418.     endday_http (day);
  419. #endif
  420. }
  421.  
  422.  
  423. static void
  424. eachcycle (time_t now)
  425. {
  426.     statslast = now;
  427. #ifdef STATS_AREA
  428.     eachcycle_area (now);
  429. #endif
  430. #ifdef STATS_USE
  431.     eachcycle_use (now);
  432. #endif
  433. #ifdef STATS_FWD
  434.     eachcycle_fwd (now);
  435. #endif
  436. #ifdef STATS_MSG
  437.     eachcycle_msg (now);
  438. #endif
  439. #ifdef STATS_TFC
  440.     eachcycle_tfc (now);
  441. #endif
  442. #ifdef STATS_HTTP
  443.     eachcycle_http (now);
  444. #endif
  445. }
  446.  
  447.  
  448. static void
  449. init (time_t now)
  450. {
  451.     statslast = 0;
  452. #ifdef STATS_AREA
  453.     init_area (now);
  454. #endif
  455. #ifdef STATS_USE
  456.     init_use (now);
  457. #endif
  458. #ifdef STATS_FWD
  459.     init_fwd (now);
  460. #endif
  461. #ifdef STATS_MSG
  462.     init_msg (now);
  463. #endif
  464. #ifdef STATS_TFC
  465.     init_tfc (now);
  466. #endif
  467. #ifdef STATS_HTTP
  468.     init_http (now);
  469. #endif
  470. }
  471.  
  472.  
  473. void
  474. statsdaemon (int i OPTIONAL, void *v1 OPTIONAL, void *v2 OPTIONAL)
  475. {
  476. time_t now, then;
  477. struct tm *t;
  478. int lastmin = -1, hour, day;
  479.  
  480.     then = now = time((time_t *)0);
  481.     init(now);
  482.     (void) doSTATload(0, (char **)0, (void *)0);
  483.     t = localtime(&now);
  484.     t->tm_min = 0;
  485.     then = mktime (t);
  486.  
  487.     /* adjust in case previously not shut down properly */
  488.     if (statslast && statslast < then)    {
  489.         /* adjust for missing hour */
  490.         hour = t->tm_hour - 1;
  491.         if (hour < 0)
  492.             hour = 23;
  493.         newhour (hour);
  494.         t->tm_hour = 0;
  495.         then = mktime (t);
  496.  
  497.         if (statslast < then)    {
  498.             /* adjust for missing day */
  499.             day = t->tm_wday - 1;
  500.             if (day < 0)
  501.                 day = 6;
  502.             newday (day);
  503.             day = t->tm_mday - 2;
  504.  
  505.             if (day < 0)    {    /* new month begins */
  506.                 /* let the OS tell us the # of days in last month */
  507.                 t->tm_mday = 1;
  508.                 t->tm_hour = 0;
  509.                 t->tm_sec = 0;
  510.                 then = mktime (t);
  511.                 then -= 3600;
  512.                 t = localtime (&then);
  513.                 day = t->tm_mday - 1;
  514.  
  515.                 endmonthclear (day + 1, t->tm_mon);
  516.             }
  517.             endday (day);
  518.         }
  519.     }
  520.  
  521.     server_disconnect_io ();
  522.     for(;;){
  523.         (void) kpause(6000L);    /* Run stats 10 times a minute, every 6 seconds */
  524.         updatestats();
  525.         now = time((time_t *)0);
  526.         t = localtime(&now);
  527.         if ((!t->tm_min && lastmin != t->tm_min) || (lastmin != -1 && lastmin > t->tm_min))    {
  528.             /* new hour begins */
  529.             hour = t->tm_hour - 1;
  530.             if (hour < 0)
  531.                 hour = 23;
  532.             newhour (hour);
  533.             if (!t->tm_hour)    {    /* new day begins */
  534.                 day = t->tm_wday - 1;
  535.                 if (day < 0)
  536.                     day = 6;
  537.                 newday(day);
  538.                 day = t->tm_mday - 2;
  539.                 if (day < 0)    {    /* new month begins */
  540.                     /* let the OS tell us the # of days in last month */
  541.                     t->tm_mday = 1;
  542.                     t->tm_hour = 0;
  543.                     t->tm_sec = 0;
  544.                     then = mktime (t);
  545.                     then -= 3600;
  546.                     t = localtime (&then);
  547.                     day = t->tm_mday - 1;
  548.  
  549.                     endmonthclear (day + 1, t->tm_mon);
  550.                 }
  551.                 endday (day);
  552.             }
  553.         }
  554.         eachcycle (now);
  555.  
  556.         if (!(t->tm_min % 10) && lastmin != t->tm_min)
  557.             (void) doSTATsave(0, (char **)0, (void *)0);
  558.  
  559.         lastmin = t->tm_min;
  560.     }
  561. }
  562.  
  563.  
  564.  
  565. #endif    /* STATS */
  566.